|
04.09.2026
09:30 Uhr
|
System.Text.Json beherrscht nun den JSON Patch-Standard nach RFC 6902.
![Neu in .NET 10.0 [39]: JSON Patch](https://heise.cloudimg.io/v7/_www-heise-de_/imgs/18/5/1/5/0/2/8/5/dotnet-sign-6f751b3d1088dffe.jpg?func=bound&height=1200&org_if_sml=1&q=85&width=1200)
Die JSON-Bibliothek System.Text.Json beherrscht nun den JSON Patch-Standard nach RFC 6902. JSON Patch ist ein standardisiertes Format, um Änderungen an JSON-Dokumenten in Form einer Sequenz von Operationen auszudrücken. Jede Operation spezifiziert dabei den Typ der Änderung (add, remove, replace, move, copy oder test) sowie den Pfad innerhalb des JSON-Dokuments, auf den sich die Modifikation bezieht.
Durch diese strukturierte Beschreibung lassen sich inkrementelle Änderungen effizient übertragen, ohne das gesamte Dokument erneut austauschen zu müssen. Insbesondere in RESTful Web-APIs ist JSON Patch ein etabliertes Mittel, um partielle Updates über HTTP-PATCH zu implementieren.
Das ist neu in .NET 11.0: Dr. Holger Schwichtenberg und weitere Experten präsentieren am 17. November 2026 auf der Online-Konferenz betterCode() .NET 11.0 die Änderungen für Entwicklerinnen und Entwickler. Tickets zum Frühbucherpreis sind im Online-Shop verfügbar.
Ein wesentliches Merkmal von JSON Patch ist die strikte Definition der Pfadangaben über JSON Pointer (RFC 6901), siehe Beispiel in folgender Tabelle. Dadurch werden Änderungen eindeutig und positionsgenau adressiert. JSON Patch eignet sich auch für komplexe Datenmodelle mit tiefen Verschachtelungen oder Arrays.
Der Vorteil von JSON Patch zeigt sich insbesondere bei großen Objekten und eingeschränkter Bandbreite, da nur inkrementelle Änderungen übertragen werden. Bei sehr kleinen Datenstrukturen kann der Mehraufwand für das Erzeugen und Verarbeiten eines Patch-Dokuments größer sein als der Gewinn gegenüber einem vollständigen Update.
Bisher musste man für JSON Patch die ältere Community-Bibliothek Newtonsoft.Json einsetzen. Nun geht es auch mit der neueren Microsoft-Bibliothek System.Text.Json.
Für JSON Patch mit System.Text.Json gibt es eine Erweiterung für System.Text.Json in Form des neuen NuGet-Pakets Microsoft.AspNetCore.JsonPatch.SystemTextJson, das erstmalig zusammen mit .NET 10.0 Preview 4 erschienen ist.
Trotz des „AspNetCore“ im Namen funktioniert dieses Zusatzpaket auch außerhalb von ASP.NET Core.
Microsoft verspricht in der neuen Implementierung „eine verbesserte Leistung und weniger Speichernutzung im Vergleich zu der existierenden Implementierung in Newtonsoft.Json“ in Verbindung mit einem ähnlichen Design wie bei Newtonsoft.Json, einschließlich der Aktualisierung eingebetteter Objekte und Arrays. Bisher nicht verfügbar ist JSON Patch für dynamische Objekte, weil Newtonsoft.Json dafür Reflection einsetzt. System.Text.Json soll aber auch mit dem NativeAOT-Compiler funktionieren.
Leider funktioniert das neue JSON-Patch-Paket nicht in Verbindung mit dem NativeAOT-Compiler des modernen .NET, sondern nur mit dem Just-in-Time-Compiler.
Im NuGet-Paket Microsoft.AspNetCore.JsonPatch.SystemTextJson gibt es eine Klasse Microsoft.AspNetCore.JsonPatch.SystemTextJson.JsonPatchDocument<T> mit einer Methode ApplyTo(obj), die eine JSON-Patch-Operation auf das übergebene Objekt anwendet. Vor dem Anwenden von ApplyTo() lädt man das JSON-Patch-Dokument via JsonSerializer.Deserialize<JsonPatchDocument<Person>>() in eine Instanz von JsonPatchDocument<T>.
ApplyTo() erwartet im zweiten Parameter vom Typ Action<JsonPatchError> eine Methode, die als Parameter Objekte vom Typ JsonPatchError entgegennimmt. Als JsonPatchError signalisiert ApplyTo() fehlerhafte Operationsnamen, fehlerhafte Pfade und fehlgeschlagene Test-Operationen. Wenn bei einer oder mehreren Operationen ein Fehler auftritt, werden die übrigen fehlerfreien Operationen dennoch verarbeitet.
Folgender Code zeigt ein Beispiel für eine Objekthierarchie:
Der folgende Codeausschnitt verändert die Objekthierarchie mit JSON Patch:
Alternativ kann man das Objekt auch als JSON ausgeben. Das habe ich im obigen Listing bewusst ausgelassen, damit nicht der Eindruck entsteht, man müsse das Objekt als JSON weiterverwenden. Folgender Code zeigt die Ausgabe als JSON:
(rme)